package cn.secby.goods.service.impl;
import cn.secby.common.core.web.mapper.WrapperParse;
import java.util.List;
import cn.secby.common.core.utils.DateUtils;
import cn.secby.goods.domain.vo.TreeSelect;
import cn.secby.goods.service.ISkuService;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import cn.secby.common.core.utils.StringUtils;
import org.springframework.transaction.annotation.Transactional;
import cn.secby.goods.domain.Sku;
import cn.secby.goods.mapper.SpuMapper;
import cn.secby.goods.domain.Spu;
import cn.secby.goods.service.ISpuService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import java.util.Arrays;
import java.util.stream.Collectors;

/**
 * 商品管理Service业务层处理
 * @author shenkunlin
 * @date 2025-05-06
 */
@Service
public class SpuServiceImpl extends ServiceImpl<SpuMapper, Spu> implements ISpuService
{
    @Autowired
    private SpuMapper spuMapper;

    @Autowired
    private ISkuService skuService;

    @Override
    public List<TreeSelect> selectSpuTreeList(Spu spu) {
        //查询商品
        List<Spu> list = list(Wrappers.<Spu>lambdaQuery()
                .eq(ObjectUtils.isNotEmpty(spu.getSpuSource()), Spu::getSpuSource, spu.getSpuSource())
                .like(ObjectUtils.isNotEmpty(spu.getTitle()), Spu::getTitle, spu.getTitle())
                .eq(ObjectUtils.isNotEmpty(spu.getBrandId()), Spu::getBrandId, spu.getBrandId())
                .eq(ObjectUtils.isNotEmpty(spu.getCategoryId()) && spu.getCategoryId()>0, Spu::getCategoryId, spu.getCategoryId())
                .eq(ObjectUtils.isNotEmpty(spu.getSpuCode()), Spu::getSpuCode, spu.getSpuCode()).last(" limit 100"));
        if(list.isEmpty()){
            return null;
        }
        //查询sku
        List<Long> ids = list.stream().map(Spu::getId).distinct().collect(Collectors.toList());
        List<Sku> skuList = skuService.list(Wrappers.<Sku>lambdaQuery().in(Sku::getSpuId, ids));
        if(skuList.isEmpty()){
            return null;
        }

        //构建树
        List<TreeSelect> tree = new ArrayList<>();
        list.forEach(s->{
            //SKU配置
            s.setSkuList(skuList.stream().filter(sku -> sku.getSpuId().equals(s.getId())).collect(Collectors.toList()));
            //组装树
            tree.add( new TreeSelect(s) );
        });

        return tree;
    }


    /**
     * 查询商品管理
     * @param id 商品管理主键
     * @return 商品管理
     */
    @Override
    public Spu selectSpuById(Long id)
    {
        //查询SPU
        Spu spu = getById(id);

        //查询SKU
        List<Sku> list = skuService.list(Wrappers.<Sku>lambdaQuery().eq(Sku::getSpuId, id));
        spu.setSkuList(list);
        return spu;
    }

    /**
     * 查询商品管理列表
     * @param spu 商品管理
     * @return 商品管理
     */
    @Override
    public List<Spu> selectSpuList(Spu spu)
    {
        return list(WrapperParse.query(spu));
    }

    /**
     * 新增商品管理
     * @param spu 商品管理
     * @return 结果
     */
    @Transactional
    @Override
    public int insertSpu(Spu spu)
    {
        int rows = spuMapper.insert(spu);
        insertSku(spu);
        return rows;
    }

    /**
     * 修改商品管理
     * @param spu 商品管理
     * @return 结果
     */
    @Transactional
    @Override
    public Boolean updateSpu(Spu spu)
    {
        spuMapper.deleteSkuBySpuId(spu.getId());
        insertSku(spu);
        return updateById(spu);
    }

    /**
     * 批量删除商品管理
     * @param ids 需要删除的商品管理主键
     * @return 结果
     */
    @Transactional
    @Override
    public Boolean deleteSpuByIds(List<Long> ids)
    {
        return removeByIds(ids);
    }

    /**
     * 删除商品管理信息
     * @param id 商品管理主键
     * @return 结果
     */
    @Transactional
    @Override
    public Boolean deleteSpuById(Long id)
    {
        return removeById(id);
    }


    /**
     * 新增规格信息
     * @param spu 商品管理对象
     */
    public void insertSku(Spu spu)
    {
        List<Sku> skuList = spu.getSkuList();
        Long id = spu.getId();
        if (StringUtils.isNotNull(skuList))
        {
            List<Sku> list = new ArrayList<Sku>();
            for (Sku sku : skuList)
            {
                sku.setSpuId(id);
                list.add(sku);
            }
            if (list.size() > 0)
            {
                skuService.saveBatch(list);
            }
        }
    }
}
